home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / iszero.c,v < prev    next >
Text File  |  1991-12-03  |  5KB  |  263 lines

  1. head     1.1;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.1.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.1
  10. date     91.12.02.21.48.41;  author kupfer;  state Exp;
  11. branches 1.1.1.1;
  12. next     ;
  13.  
  14. 1.1.1.1
  15. date     91.12.02.21.49.13;  author kupfer;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @Miscellaneous tests on IEEE floating point numbers.
  22. @
  23.  
  24.  
  25.  
  26. 1.1
  27. log
  28. @Initial revision
  29. @
  30. text
  31. @/* 
  32.  * iszero.c --
  33.  *
  34.  *    Procedure to determine whether a double is a zero, normal,
  35.  *    subnormal, etc.  This requires the number to be in IEEE format,
  36.  *    so this may end up being machine-dependent.  These routines
  37.  *    could be more efficient, but they're hardly used anyways.
  38.  *
  39.  *
  40.  * Copyright 1990 Regents of the University of California
  41.  * Permission to use, copy, modify, and distribute this
  42.  * software and its documentation for any purpose and without
  43.  * fee is hereby granted, provided that the above copyright
  44.  * notice appear in all copies.  The University of California
  45.  * makes no representations about the suitability of this
  46.  * software for any purpose.  It is provided "as is" without
  47.  * express or implied warranty.
  48.  */
  49.  
  50. #ifndef lint
  51. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/sun3.md/RCS/isnan.c,v 1.2 90/09/11 14:47:34 kupfer Exp $ SPRITE (Berkeley)";
  52. #endif /* not lint */
  53.  
  54. #include <math.h>
  55. #include <machparam.h>
  56.  
  57. #if BYTE_ORDER == LITTLE_ENDIAN
  58. #define HIGH 1
  59. #define LOW 0
  60. #endif
  61. #if BYTE_ORDER == BIG_ENDIAN
  62. #define HIGH 0
  63. #define LOW 1
  64. #endif
  65.  
  66. #define SIGN 1
  67. #define ZEROEXP 2
  68. #define VALIDEXP 4
  69. #define HIEXP 8
  70. #define FRAC 16
  71.  
  72. #define SIGNBITS 0x80000000
  73. #define EXPBITS 0x7ff00000
  74. #define MANTBITS 0x000fffff
  75.  
  76. static int parts();
  77.  
  78. /*
  79.  *----------------------------------------------------------------------
  80.  *
  81.  * issubnormal --
  82.  *
  83.  *      Return whether a double is subnormal.
  84.  *
  85.  * Results:
  86.  *      1 if the number is subnormal, 0 otherwise.
  87.  *
  88.  * Side effects:
  89.  *      None.
  90.  *
  91.  *----------------------------------------------------------------------
  92.  */
  93. int issubnormal(value)
  94. double value;
  95. {
  96.     int result;
  97.     result = parts(value);
  98.     return (result&ZEROEXP) && (result&FRAC);
  99. }
  100.  
  101. /*
  102.  *----------------------------------------------------------------------
  103.  *
  104.  * isnormal --
  105.  *
  106.  *      Return whether a double is normal.
  107.  *
  108.  * Results:
  109.  *      1 if the number is normal, 0 otherwise.
  110.  *
  111.  * Side effects:
  112.  *      None.
  113.  *
  114.  *----------------------------------------------------------------------
  115.  */
  116. int isnormal(value)
  117. double value;
  118. {
  119.     int result;
  120.     result = parts(value);
  121.     return (result&VALIDEXP)!=0;
  122. }
  123.  
  124. /*
  125.  *----------------------------------------------------------------------
  126.  *
  127.  * iszero --
  128.  *
  129.  *      Return whether a double is zero.
  130.  *
  131.  * Results:
  132.  *      1 if the number is zero, 0 otherwise.
  133.  *
  134.  * Side effects:
  135.  *      None.
  136.  *
  137.  *----------------------------------------------------------------------
  138.  */
  139. int iszero(value)
  140. double value;
  141. {
  142.     int result;
  143.     result = parts(value);
  144.     return (result&ZEROEXP) && !(result&FRAC);
  145. }
  146.  
  147. /*
  148.  *----------------------------------------------------------------------
  149.  *
  150.  * signbit --
  151.  *
  152.  *      Return whether a double has the sign set.
  153.  *
  154.  * Results:
  155.  *      1 if the number has sign set, 0 otherwise.
  156.  *
  157.  * Side effects:
  158.  *      None.
  159.  *
  160.  *----------------------------------------------------------------------
  161.  */
  162. int signbit(value)
  163. double value;
  164. {
  165.     int result;
  166.     result = parts(value);
  167.     return (result&SIGN)!=0;
  168. }
  169.  
  170. /*
  171.  *----------------------------------------------------------------------
  172.  *
  173.  * parts --
  174.  *
  175.  *    Sets bits according to the parts of the IEEE floating point number.
  176.  *
  177.  * Results:
  178.  *    Sets SIGN if sign bit set.
  179.  *    Sets ZEROEXP if exponent is zero.
  180.  *    Sets VALIDEXP if exponent is not zero or max.
  181.  *    Sets HIEXP if exponent is max.
  182.  *    Sets FRAC if fraction is nonzero.
  183.  *
  184.  * Side effects:
  185.  *    None.
  186.  *
  187.  *----------------------------------------------------------------------
  188.  */
  189.  
  190. static int
  191. parts(value)
  192. double value;
  193. {
  194.     int result = 0;
  195.  
  196.     union {
  197.     double d;
  198.     long l[2];
  199.     } u;
  200.  
  201.     /*
  202.      * Put the value into a union so we can check out the bits.
  203.      */
  204.     u.d = value;
  205.  
  206.  
  207.     /*
  208.      * An IEEE Std 754 double precision floating point number
  209.      * has the following format:
  210.      *
  211.      *      1  bit       -- sign of Mantissa
  212.      *      11 bits      -- exponent
  213.      *      52 bits      -- Mantissa
  214.      *
  215.      * If the exponent has all bits set, the value is not a 
  216.      * real number.
  217.      *
  218.      * If the Mantissa is zero then the value is infinity, which
  219.      * is the result of division by zero, or overflow.
  220.      *
  221.      * If the Mantissa is non-zero the value is not a number (NaN).
  222.      * NaN can be generated by dividing zero by itself, taking the
  223.      * logarithm of a negative number, etc.
  224.      */
  225.  
  226.     /*
  227.      * Check the sign.
  228.      */
  229.     if (u.l[HIGH] & SIGNBITS) {
  230.     result |= SIGN;
  231.     }
  232.     /*
  233.      * check the exponent
  234.      */
  235.     if ((u.l[HIGH] & 0x7ff00000) == 0x7ff00000) {
  236.     result |= HIEXP;
  237.     } else if ((u.l[HIGH] & 0x7ff00000) == 0) {
  238.     result |= ZEROEXP;
  239.     } else {
  240.     result |= VALIDEXP;
  241.     }
  242.  
  243.     if ((u.l[HIGH] & ~0xfff00000) != 0 || u.l[LOW] != 0) {
  244.     result |= FRAC;
  245.     }
  246.  
  247.     return result;
  248. }
  249.  
  250.  
  251. @
  252.  
  253.  
  254. 1.1.1.1
  255. log
  256. @Initial branch for Sprite server.
  257. @
  258. text
  259. @d21 1
  260. a21 1
  261. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/iszero.c,v 1.1 91/12/02 21:48:41 kupfer Exp $ SPRITE (Berkeley)";
  262. @
  263.